package com.tony.guice.LinkBind;

import com.google.inject.AbstractModule;
import com.google.inject.Provides;
import com.google.inject.name.Named;
import com.google.inject.name.Names;
import com.tony.guice.BindAnnotations.BindAnno;
import com.tony.guice.Common.*;

/**
 * @version V1.0  </br>
 * @ClassName TonyModule </br>
 * @Description TODO  </br>
 * @Author tonywang</br>
 * @DATE 2/28/2019 3:39 PM</br>
 */
public class TonyModule extends AbstractModule {
    @Override
    protected void configure() {
        //Linked Bindings（链式绑定） 链式绑定，绑定的是 接口 和 接口的实现类。
        bind(TransactionLog.class).to(DataTransactionLog.class);//把接口 TransactionLog 绑定到它的具体实现类 DatabaseTransactionLog
        bind(DataTransactionLog.class).to(MyTransactionLog.class);//injector 会把所有 TransactionLog 替换为 MySqlDatabaseTransactionLog。
//        bind(TransactionLog.class).annotatedWith(BindAnno.class).to(BindAnnoLog.class);
        bind(BillingService.class).to(RealBillingService.class);
//        bind(TransactionLog.class).annotatedWith(Names.named("test")).to(BindAnnoLog.class);

        //实例绑定，绑定的是 类型 和 该类型的值对象（类和类实例也可以，但是这个类不要太复杂）。
        bind(String.class).annotatedWith(Names.named("name")).toInstance("name str");
        bind(Integer.class).annotatedWith(Names.named("num")).toInstance(123);
//        bind(TransactionLog.class).toProvider(DatabaseTransactionLogProvider.class);
        //无目标绑定
//        bind(TransactionLog.class);
        //构造器绑定
        try {
            bind(BillingService.class).toConstructor(RealBillingService.class.getConstructor(TransactionLog.class));
        } catch (NoSuchMethodException pE) {
            pE.printStackTrace();
        }

        //内置绑定
    }
/**
 * @Provides 方法有类似 @Paypal 或 @Named("Checkout") 这样的绑定注解，则 guice 以绑定注解优先，绑定注解配置找不到的话，才找 @Provides 方法
 * @return com.tony.guice.Common.TransactionLog
 **/
    @Provides
    public TransactionLog provideTransactionLog() {
        DataTransactionLog log = new DataTransactionLog();
        log.setUrl("jdbc:mysql://localhost/pizza").setPoolSize(5);
        return log;
    }
}
